/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.switz.agendacita.controller;

import com.switz.agendacita.dto.*;
import com.switz.agendacita.services.iface.UsuarioService;
import com.switz.agendacita.utils.Constantes;
import com.switz.agendacita.utils.EncryptAES;
import com.switz.agendacita.utils.GeneradorClaves;
import com.switz.agendacita.vo.HorarioDisponible;
import java.io.IOException;
import java.lang.reflect.Array;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.switz.agendacita.utils.GeneradorClaves;
import com.switz.agendacita.utils.mail.MailMail;
import com.switz.agendacita.vo.ReservacionSeleccionada;
import java.net.URLEncoder;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 *
 * @author jose angel
 */
@Controller
public class UsuarioController {

    @Autowired
    @Qualifier("usuarioServiceImpl")
    private UsuarioService usuarioService;
    @Autowired
    private MailMail mailMail;

    @RequestMapping(value = "/modificarDiasLaborales")
    @ResponseBody
    public void modificarDiasLaborales() {
        String idPersonal = "12IMI1728F000";
        String idEmpresa = "HBC6EYQS807";
        List<PersonalHorario> diasLaborales = new LinkedList<>();
        diasLaborales.add(new PersonalHorario(idEmpresa, idPersonal, 1, new Time(15, 00, 00), new Time(21, 00, 00)));//1
        diasLaborales.add(new PersonalHorario(idEmpresa, idPersonal, 2, new Time(15, 00, 00), new Time(21, 00, 00)));//4
        diasLaborales.add(new PersonalHorario(idEmpresa, idPersonal, 3, new Time(15, 00, 00), new Time(21, 00, 00)));//5
        diasLaborales.add(new PersonalHorario(idEmpresa, idPersonal, 4, new Time(15, 00, 00), new Time(21, 00, 00)));//5
        diasLaborales.add(new PersonalHorario(idEmpresa, idPersonal, 5, new Time(15, 00, 00), new Time(21, 00, 00)));//5
   

        List<PersonalNoHorario> horariosDescanzo = new LinkedList<>();
        horariosDescanzo.add(new PersonalNoHorario(idEmpresa, idPersonal, new Time(16, 00, 00), new Time(16, 30, 00), 1));
        horariosDescanzo.add(new PersonalNoHorario(idEmpresa, idPersonal, new Time(16, 00, 00), new Time(16, 30, 00), 2));
        horariosDescanzo.add(new PersonalNoHorario(idEmpresa, idPersonal, new Time(16, 00, 00), new Time(16, 30, 00), 3));
        horariosDescanzo.add(new PersonalNoHorario(idEmpresa, idPersonal, new Time(16, 00, 00), new Time(16, 30, 00), 4));
        horariosDescanzo.add(new PersonalNoHorario(idEmpresa, idPersonal, new Time(16, 00, 00), new Time(16, 30, 00), 5));
   


        usuarioService.modificarDiasLaboralesTXT(idEmpresa, idPersonal, diasLaborales, horariosDescanzo);

    }

    @RequestMapping(value = "/registrarPersonal")
    @ResponseBody
    public void registrarPersonal
            (@RequestParam("servicios") String[] servicios,
            @RequestParam("dia") String[] dia,
            @RequestParam("horaI") String[] horaI,
            @RequestParam("horaF") String[] horaF,
            @RequestParam("diaNH") String[] diaNH,
            @RequestParam("horaNHI") String[] horaNHI,
            @RequestParam("horaNHF") String[] horaNHF,
            @RequestParam("status") String status,
            @RequestParam("tipoUsuario") String tipoUsuario,
            @RequestParam("idEmpresa") String idEmpresa,
            @RequestParam("nombre") String nombre,
            @RequestParam("telefono") String telefono,
            @RequestParam("movil") String movil,
            @RequestParam("mail") String mail,
            @RequestParam("psw") String psw){
        
        //datos
        //crea la lista de servicios por personal
        List<PersonalServicio> personalServiciosList = new LinkedList();
        for(String str: servicios){
            personalServiciosList.add(new PersonalServicio(str, idEmpresa));
        }
        
        //crea la lista de dias laborales para el personal        
        List<PersonalHorario> diasLaborales = new LinkedList();
        for(int i=0;i<dia.length;i++){
            StringTokenizer tokenI = new StringTokenizer(horaI[i],":");
            StringTokenizer tokenF = new StringTokenizer(horaF[i],":");
            
            diasLaborales.add(new PersonalHorario(idEmpresa, null,Integer.parseInt(dia[i]), 
                                new Time(Integer.parseInt(tokenI.nextToken()),Integer.parseInt(tokenI.nextToken()),Integer.parseInt(tokenI.nextToken())), 
                                new Time(Integer.parseInt(tokenF.nextToken()),Integer.parseInt(tokenF.nextToken()),Integer.parseInt(tokenF.nextToken()))));
        }
        
        //crea la lista de horarios descanzos para el personal       
        List<PersonalNoHorario> horariosDescanzos = new LinkedList();
        for(int i=0;i<diaNH.length;i++){
            StringTokenizer tokenI = new StringTokenizer(horaNHI[i],":");
            StringTokenizer tokenF = new StringTokenizer(horaNHF[i],":");
            
            horariosDescanzos.add(new PersonalNoHorario(idEmpresa, 
                                new Time(Integer.parseInt(tokenI.nextToken()),Integer.parseInt(tokenI.nextToken()),Integer.parseInt(tokenI.nextToken())), 
                                new Time(Integer.parseInt(tokenF.nextToken()),Integer.parseInt(tokenF.nextToken()),Integer.parseInt(tokenF.nextToken())),
                                Integer.parseInt(dia[i])));
        }
        
        usuarioService.registrarPersonalTXT(new Usuario(nombre, telefono,movil, mail,psw,2,1), idEmpresa, personalServiciosList, diasLaborales, horariosDescanzos);

    }

    @RequestMapping(value = "/modificarUsuario")
    @ResponseBody
    public void modificiarUsuario(
            @RequestParam("nombre") String nombre,
            @RequestParam("telefono") String telefono,
            @RequestParam("movil") String movil,
            @RequestParam("mail") String mail) {

        Usuario usuario = new Usuario();
        //obtener id desde session
        usuario.setId("12HHY2848R000");
        usuario.setNombre(nombre);
        usuario.setTelefono(telefono);
        usuario.setMovil(movil);
        usuario.setMail(mail);


        usuarioService.modificarUsuario(usuario);

    }

    @RequestMapping(value = "/eliminarUsuario")
    @ResponseBody
    public void eliminarUsuario() {

        Usuario usuario = new Usuario();
        //obtener id desde session
        usuario.setId("12HHY2848R000");
        usuario.setStatus(0);

        usuarioService.eliminarUsuario(usuario);

    }

    @RequestMapping(value = "/insertarUsuario")
    @ResponseBody
    public void insertarUsuario(
            @RequestParam("nombre") String nombre,
            @RequestParam("telefono") String telefono,
            @RequestParam("movil") String movil,
            @RequestParam("mail") String mail,
            @RequestParam("psw") String psw) throws IOException {
    	
        
        Usuario usuario = new Usuario();
        
        usuario.setNombre(nombre);
        usuario.setTelefono(telefono);
        usuario.setMovil(movil);
        usuario.setMail(mail);
        usuario.setPsw(psw);
        usuario.setTipoUsuario(1);
        usuario.setStatus(0);


        usuarioService.registrarUsuario(usuario);

    }

    @RequestMapping(value = "/listarHorasDisponibles")
    @ResponseBody
    public List listarHorasDisponibles(
            @RequestParam("idPersonal") String idPersonal,
            @RequestParam("date") String date,
            @RequestParam("idServicio") String idServicio,
            @RequestParam("idEmpresa") String idEmpresa) {

        return usuarioService.listarHorasDisponibles(idPersonal, date, idServicio, idEmpresa);


    }

    @RequestMapping(value = "/listarDiasSaturadosPorPersonal")
    @ResponseBody
    public List listarDiasSaturadosPorPersonal(
            @RequestParam("idPersonal") String idPersonal,
            @RequestParam("idServicio") String idServicio,
            @RequestParam("idEmpresa") String idEmpresa) {
        return usuarioService.listarDiasSaturadosPorPersonal(idPersonal, idServicio, idEmpresa);

    }

    @RequestMapping(value = "/obtenerHorarioMasCercano")
    @ResponseBody
    public HorarioDisponible obtenerHorarioMasCercano(
            @RequestParam("idPersonal") String idPersonal,
            @RequestParam("idServicio") String idServicio,
            @RequestParam("idEmpresa") String idEmpresa) {
        return usuarioService.obtenerPrimerHorarioDisponible(idPersonal, idServicio, idEmpresa);

    }

    @RequestMapping(value = "/listarPersonalEnFuncionServicioEmpresa")
    @ResponseBody
    public List listarPersonalEnFuncionServicioEmpresa(@RequestParam("idServicio") String idServicio,
            @RequestParam("idEmpresa") String idEmpresa) {
        return usuarioService.listarPersonalEnFuncionServicioEmpresa(idServicio, idEmpresa);




    }

 

    @RequestMapping(value = "/reservacionesPendientes")
    @ResponseBody
    public List listarReservacionesPendientes(@RequestParam("idusuario") String idUsuario) {

        return usuarioService.listarReservacionesPendientesPorUsuario(idUsuario);

    }

    @RequestMapping(value = "/obtenerUsuarioPorMovil")
    @ResponseBody
    public List obtenerUsuarioPorMovil(
            @RequestParam("movil") String movil) {
        return usuarioService.obtenerUsuarioPorMovil(movil);
    }

    @RequestMapping(value = "/obtenerUsuarioPorTelefono")
    @ResponseBody
    public List obtenerUsuarioPorTelefono(@RequestParam("telefono") String telefono) {
        return usuarioService.obtenerUsuarioPorTelefono(telefono);
    }

    @RequestMapping(value = "/obtenerUsuarioPorMail")
    @ResponseBody
    public Usuario obtenerUsuarioPorMail(@RequestParam("mail") String mail) {
        return usuarioService.obtenerUsuarioPorMail(mail);
    }

    @RequestMapping(value = "/obtenerUsuarioPorReservacion")
    @ResponseBody
    public Usuario obtenerUsuarioPorReservacion() {
        return usuarioService.obtenerUsuarioPorReservacion("11111111111");
    }

    @RequestMapping(value = "/loginUsuario")
    @ResponseBody
    public Usuario loginUsuario(
            @RequestParam("mailUsuario") String mailUsuario,
            @RequestParam("contrasena") String contrasena){
        return usuarioService.loginUsuario(mailUsuario, contrasena, 2);
    }

    
    @RequestMapping(value="/restablecerPswUsuario")
    @ResponseBody
    public void restablecerPswUsuario(){
    	usuarioService.restablecerPswUsuario("consuelo", "12msk123b123");
    }
    
    
    @RequestMapping(value ="/comprobraDisponibilidadHorario")
	@ResponseBody
	public boolean comprobraDisponibilidadHorario(
                    @RequestParam("horaInicio") Time horaInicio,
		    @RequestParam("horaFin") Time horaFin,
		    @RequestParam("idPersonal") String idPersonal,
		    @RequestParam("fecha") Date fecha){
		
		return usuarioService.comprobarDisponibilidadHorario(horaInicio,horaFin,idPersonal,fecha);
		
		
	}
    @RequestMapping(value="/actualizarPsw")
    @ResponseBody
    public boolean actualizarPsw(
              @RequestParam("idUsuario") String idUsuario,
	      @RequestParam("psw") String psw,
	      @RequestParam("pswNuevo") String pswNuevo
		             
             ){
        
    	return usuarioService.actualizarPsw(idUsuario,psw,pswNuevo);
    }
    
     @RequestMapping(value = "/confirmarUsuario")
    public String confirmarUsuario(@RequestParam("idUsuario") String idUsuario, HttpSession session) {


        //System.out.println("id  como viene de la url " + idUsuario);
        EncryptAES e = new EncryptAES();
        String idDesencriptado = null;
        try {
            idDesencriptado = e.decrypt(idUsuario);
            //  System.out.println("id desincriptado " + idDesincriptado);
        } catch (Exception ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
        Usuario usr = usuarioService.obtenerUsuario(idDesencriptado);



        if (usr != null) {
            usuarioService.actualizarStatusUsuario(idDesencriptado);

            usr.setStatus(1);
            session.setAttribute("usuario", usr);
            return "usuarioAdmin";
        } else {
            return "failed";
        }


    }
     
    @RequestMapping(value = "/enviarCorreoUsuario",method = RequestMethod.POST)
    @ResponseBody
    public String enviarCorreoUsuario(@RequestParam("mail") String mail, @RequestParam("id") String id) {
   
    String cadena="success";
        try {
            EncryptAES aES = new EncryptAES();
            String idEncriptado = aES.encrypt(id);
            //System.out.println("id empresa encriptado "+idEncriptado);
            String idEncodificadoEIncriptado = URLEncoder.encode(idEncriptado);
            //System.out.println("id empresa encodificado "+idEncodificadoEIncriptado);
            //enviamos correo de confirmar usuario 
            mailMail.sendMail(mail, "confirmar Usuario",
                    new String().format(Constantes.CONFIRMAR_USUARIO, idEncodificadoEIncriptado));

        } catch (Exception ex) {
            cadena="failed";
        }
        return cadena;
    }

      
}
